package cn.dengta.webapp.live.entity;

import java.math.BigDecimal;
import java.util.Date;

import cn.dengta.common.model.Status;
import cn.dengta.common.util.Common;
import cn.dengta.webapp.base.entity.BaseEntity;
import cn.dengta.webapp.base.entity.TimeBasedEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import me.codeplayer.util.StringUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;

/**
 * 直播表
 *
 * @author zw
 * @since 2022-12-26
 */
@Setter
@Getter
@Accessors(chain = true)
@TableName("im_live")
public class Live extends TimeBasedEntity {

	private static final long serialVersionUID = 1L;

	/** 直播类型：默认（即单人秀场直播） */
	public static final int TYPE_DEFAULT = 0;
	/** 直播类型：PK（与其他主播PK直播） */
	public static final int TYPE_PK = 1;
	/** 直播类型：连麦（与观众连麦直播） */
	public static final int TYPE_MIC = 2;

	/** 主播用户ID */
	Long userId;
	/** 直播频道号 */
	String channelName;
	/** 是否推荐直播间 */
	Integer recommend;
	/** 直播类型：0=普通；1=PK; 2=连麦 */
	Integer type;
	/** 新用户标签：0=否；1=是 */
	Integer newUserTag;
	/** 有效观众人数（延迟写入） */
	Integer userCount;
	/** 本场直播热度（延迟写入） */
	Long hot;
	/** 本场直播后总的钻石数(历史的直播总和) */
	Long liveCoins;
	/** 本场直播消费钻石总数（延迟写入） */
	Long coin;
	/** 点赞数（延迟写入） */
	Long digCount;
	/** 点赞人数（延迟写入） */
	Integer digUserCount;
	/** 直播状态：1=直播中；-1=直播结束；-2=被封禁 */
	Integer status;
	/** 结束时间 */
	Date endTime;
	/** 直播时长（秒） */
	Long duration;
	/** 评论次数 */
	Long commentTimes;
	/** 评论人数 */
	Integer commentUserCount;
	/** 新关注数 => 结束时的关注数 - 开播时的关注数 */
	Integer newFollowCount;
	/** 总粉丝数 */
	Integer totalFollowCount;
	/** 推广员ID */
	Long agentId;
	/** 本场直播总积分（延迟写入） */
	BigDecimal integral;
	/** 送礼次数（延迟写入） */
	Integer sendGiftTimes;
	/** 送礼人数（延迟写入） */
	Integer sendGiftUserCount;
	/** 机器人人数（延迟写入） */
	Integer robotCount;
	/** 转发量 */
	Integer relayTimes;
	/** 互动量 */
	Integer contactTimes;
	/** 直播评级ID */
	Long liveAnchorAssessId;

	transient Integer liveUserCount;
	transient Long maxId;

	public static Live of(Long userId, boolean isNewcomer, String channelName, final Date now) {
		final Live live = new Live();
		live.userId = userId;
		live.channelName = channelName;
		live.type = TYPE_DEFAULT;
		live.userCount = live.commentUserCount = live.digUserCount = 0;
		live.newFollowCount = live.totalFollowCount = live.sendGiftTimes = live.sendGiftUserCount = 0;
		live.newUserTag = isNewcomer ? 1 : 0;
		live.integral = BigDecimal.ZERO;
		live.hot = live.coin = live.digCount = live.duration = 0L;
		live.status = Status.YES.value;
		live.liveUserCount = 0;
		live.relayTimes = 0;
		live.contactTimes = 0;
		live.initTime(now);
		return live;
	}

	/**
	 * 构造直播间频道号
	 *
	 * @return {@code "R-$$userId-$liveId"}
	 */
	public static String channelName(Long userId, long liveId) {
		return "R-" + BaseEntity.id2Alias(userId) + "-" + liveId;
	}

	public static Long resolveUserId(String channelName) {
		return BaseEntity.alias2Id(StringUtils.substringBetween(channelName, "-", "-"));
	}

	/**
	 * 指示指定用户是否拥有该直播间（意即用户在自己的直播间内，可视为处于直播中的状态）
	 */
	public static boolean ownChannelName(Long userId, String channelName) {
		return StringUtil.notEmpty(channelName) && userId.equals(resolveUserId(channelName));
	}

	/**
	 * 从主播频道名称中解析出 主播用户ID 和 直播间ID
	 *
	 * @see #channelName(Long, long)
	 */
	public static Pair<Long, Long> resolveUserIdAndLiveId(String liveChannelName) {
		String[] parts = liveChannelName.split("-");
		final Long userId = BaseEntity.alias2Id(parts[1]);
		final Long liveId = Long.valueOf(parts[2]);
		return Pair.of(userId, liveId);
	}

	/** 正在直播中 */
	public boolean living() {
		return status > 0;
	}

	/** 是否连麦中 */
	public boolean hasMic() {
		return type == TYPE_MIC;
	}

	/** 是否在PK */
	public boolean hasPK() {
		return type == TYPE_PK;
	}

	/** 是否是普通直播 */
	public boolean hasSimple() {
		return living() && type == TYPE_DEFAULT;
	}

	public String logKey() {
		return userId + Common.LINE_SEP + StringUtil.toString(agentId);
	}

	public static final String USER_ID = "user_id";
	public static final String STATUS = "status";
	public static final String TYPE = "type";
	public static final String NEW_USER_TAG = "new_user_tag";
	public static final String END_TIME = "end_time";
	public static final String HOT = "hot";
	public static final String LIVE_COINS = "live_coins";
	public static final String DURATION = "duration";
	public static final String COMMENT_USER_COUNT = "comment_user_count";
	public static final String USER_COUNT = "user_count";
	public static final String DIG_COUNT = "dig_count";
	public static final String COIN = "coin";
	public static final String AGENT_ID = "agent_id";
	public static final String LIVE_ANCHOR_ASSESS_ID = "live_anchor_assess_id";
	public static final String CHANNEL_NAME = "channel_name";
	public static final String RECOMMEND = "recommend";

}
